package com.dongdongshop.aop;

import com.alibaba.fastjson.JSONObject;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;


@Component
@Aspect//将当前类定义为切面类
public class LogAspect {

    private Logger logger = LoggerFactory.getLogger(LogAspect.class);
    //第一切点表达式
    //第一个* 任意返回值 第二个*任意类 第三个*类中所有的方法 （..）不管有多山参数都切
    @Pointcut("execution(* com.dongdongshop.service.*.*(..))")
    public void aopLog(){}
    //进通知
    //前置通知  被拦截方法调用之前打印
    @Before("aopLog()")
    public void doBefore(JoinPoint joinPoint)throws Throwable{
        //参数
        Object[] args = joinPoint.getArgs();
        //获取被拦截的方法
        Signature signature = joinPoint.getSignature();
        logger.info("进入 {} 方法 参数为 {}",signature,args);
    }


    //返回后通知  被拦截方法调用之后打印
    @AfterReturning(value = "aopLog()",returning = "obj")
    public void doAfter(Object obj){
        logger.info("方法调用成功，返回数值为：{}", JSONObject.toJSONString(obj));
    }
}
